package algo_lignes_sites.params.objects.contraintesgeom;

import commons.data.category.Category;
import commons.utils.Utils.Side;
import java.util.ArrayList;
import java.util.HashMap;

public class ContrainteGeomLine {

	public String name;
	public Category categoryPath;
	public double epaisseurTrait_papier_mm;
	public double espaceAutour_papier_mm;

	public double epaisseur_dissymetrie_mm;
	public Side sideDissymetrie;

	public ContrainteGeomLine(Category categoryPath, double epaisseurTrait_papier_mm, double espaceAutour_papier_mm, double epaisseur_disymetrie_mm, Side side) {
		this.categoryPath = categoryPath;
		this.name = categoryPath==null ? "" : categoryPath.toString();
		this.epaisseurTrait_papier_mm = epaisseurTrait_papier_mm;
		this.espaceAutour_papier_mm = espaceAutour_papier_mm;
		this.epaisseur_dissymetrie_mm = epaisseur_disymetrie_mm;
		this.sideDissymetrie = side;
	}

	public boolean hasDissymetrie() {return epaisseur_dissymetrie_mm > 0;}

	@Override
	public String toString() {
		return name + " -> ep. trait = " + epaisseurTrait_papier_mm + " , espace = "  + espaceAutour_papier_mm;
	}
	
	public boolean equals(ContrainteGeomLine cgl) {
		if (this==cgl)
			return true;
		return this.epaisseurTrait_papier_mm == cgl.epaisseurTrait_papier_mm &&
				this.espaceAutour_papier_mm == cgl.espaceAutour_papier_mm &&
				this.epaisseur_dissymetrie_mm == cgl.epaisseur_dissymetrie_mm &&
				this.sideDissymetrie == cgl.sideDissymetrie;
	}
	
	// Crée une nouvelle contrainte geom, a partir de cgl1 et en ecrasant avec les valeurs de cgl2 quand elles sont renseignées (<> Nan)
	static public ContrainteGeomLine createContrainteGeomLine(ContrainteGeomLine cgl1, ContrainteGeomLine cgl2) {
		// Cas particulier
		if (cgl1 == null)
			return cgl2;
		
		// On part de cgl1
		ContrainteGeomLine cgl_new = new ContrainteGeomLine(cgl1.categoryPath, cgl1.epaisseurTrait_papier_mm, cgl1.espaceAutour_papier_mm, cgl1.epaisseur_dissymetrie_mm, cgl1.sideDissymetrie);
		
		// Puis on ajoute les données de cgl2 si elles sont non Nan
		cgl_new.categoryPath = null; // la notion de categorie n'a plus de sens, elle n'est utiles que pour les CGL initiales, celles du tableau de paramètres utilisateur
		cgl_new.name = cgl1.name + " / " + cgl2.name;
		if (!Double.isNaN(cgl2.epaisseurTrait_papier_mm)) cgl_new.epaisseurTrait_papier_mm = cgl2.epaisseurTrait_papier_mm;
		if (!Double.isNaN(cgl2.espaceAutour_papier_mm)) cgl_new.espaceAutour_papier_mm = cgl2.espaceAutour_papier_mm;
		if (!Double.isNaN(cgl2.epaisseur_dissymetrie_mm)) {
			cgl_new.epaisseur_dissymetrie_mm = cgl2.epaisseur_dissymetrie_mm;
			cgl_new.sideDissymetrie = cgl2.sideDissymetrie; // peut etre null ssi epaisseur_dissy=0.0
		}
		//else : si epaisseDissy = Nan, cela signifie que l'utilisateur a laissé la case vide et que donc la dissy est null : on ne recopie rien
		
		// a present, pour ne pas créer trop d'objet ContrainteGeomLine qui seront stockés dans les Segment_in (très nombreux !)
		// on gère un cache
		return getCGL_ifDejaCree(cgl_new);
	}
	
	public String isFullyFilled() {
		String err = "";
		if (Double.isNaN(epaisseurTrait_papier_mm)) err += "epaisseur , ";
		if (Double.isNaN(espaceAutour_papier_mm)) err += "espace , ";
		if (Double.isNaN(epaisseur_dissymetrie_mm)) err += "épaisseur dissymetrie , ";
		return err;
	}
	
	
	// Gestion d'un cache de ContrainteGeomNode
	private static HashMap<String, ContrainteGeomLine> cache;
	private static ContrainteGeomLine getCGL_ifDejaCree(ContrainteGeomLine cgl) {
		if (cache==null)
			cache = new HashMap<String, ContrainteGeomLine>();
		String hash = cgl.getHash();
		if (cache.containsKey(hash))
			return cache.get(hash);
		cache.put(hash, cgl);
		return cgl;
	}
	
	private String getHash() {
		return "" + categoryPath + "_" + epaisseurTrait_papier_mm + "_" + espaceAutour_papier_mm + "_" + epaisseur_dissymetrie_mm + "_" + sideDissymetrie;
	}

	
}
